import { ref, Ref } from 'vue';
import { useQuasar } from 'quasar';
import { login, register } from '../services/auth';
import { useChatStore } from '../stores/chat';

export interface LoginForm {
  username: string;
  password: string;
}

export interface RegisterForm {
  name: string;
  email: string;
  password: string;
  confirmPassword: string;
  phone?: string;
}

export function useLogin() {
  const $q = useQuasar();
  const chatStore = useChatStore();

  // 状态
  const activeTab = ref('login');
  const loading = ref(false);
  const loginForm = ref<LoginForm>({
    username: '',
    password: '',
  });
  const registerForm = ref<RegisterForm>({
    name: '',
    email: '',
    password: '',
    confirmPassword: '',
    phone: '',
  });

  // 登录
  const handleLogin = async (): Promise<any> => {
    if (!loginForm.value.username || !loginForm.value.password) {
      $q.notify({
        type: 'warning',
        message: '请填写完整信息',
      });
      return null;
    }

    loading.value = true;
    try {
      const result = await login(loginForm.value.username, loginForm.value.password);
      $q.notify({
        type: 'positive',
        message: '登录成功',
      });
      
      // 注意：登录逻辑已经在 auth.ts 中处理，这里不需要再设置用户ID
      // connect 函数会从存储中读取 open_id，并自动处理用户切换逻辑
      
      // 连接 WebSocket（使用订阅 ID）
      // connect 函数会从存储中读取新的用户ID，并自动处理用户切换
      if (result.subscription_id) {
        await chatStore.connect(result.subscription_id);
        
        // 登录成功后检查未读消息（延迟一下，确保WebSocket连接建立）
        // 使用更长的延迟，确保消息接收正常后再检查
        // 注意：这个检查是异步的，不会阻塞消息接收
        setTimeout(() => {
          // 使用立即执行的异步函数，确保错误不会影响主流程
          (async () => {
            try {
              const { getUnreadStats } = await import('../services/im-chat');
              const { notifyNewMessages } = await import('../utils/notification');
              
              // 检查WebSocket是否已连接
              if (!chatStore.isConnected) {
                console.log('WebSocket未连接，跳过未读消息检查');
                return;
              }
              
              const stats = await getUnreadStats();
              
              if (stats && stats.total_unread > 0) {
                console.log('检测到未读消息:', stats);
                // 显示桌面通知和播放声音
                await notifyNewMessages(stats.total_unread, stats.unread_chats || []);
                
                // 触发事件，让父组件显示新消息提示弹窗
                window.dispatchEvent(new CustomEvent('new-messages-detected', {
                  detail: stats
                }));
              }
            } catch (error) {
              console.warn('检查未读消息失败:', error);
              // 不显示错误提示，避免影响用户体验
              // 这个错误不应该影响正常的消息接收
            }
          })();
        }, 2000); // 增加到2秒，确保WebSocket连接和消息接收都正常
      } else {
        $q.notify({
          type: 'warning',
          message: '未获取到订阅 ID，WebSocket 连接可能失败',
        });
      }
      
      return result;
    } catch (error: any) {
      $q.notify({
        type: 'negative',
        message: error.message || '登录失败',
      });
      throw error;
    } finally {
      loading.value = false;
    }
  };

  // 注册
  const handleRegister = async (): Promise<void> => {
    if (!registerForm.value.name || !registerForm.value.email || !registerForm.value.password) {
      $q.notify({
        type: 'warning',
        message: '请填写完整信息',
      });
      return;
    }

    // 用户名长度校验
    if (registerForm.value.name.length < 2 || registerForm.value.name.length > 20) {
      $q.notify({
        type: 'warning',
        message: '用户名长度应在2-20个字符之间',
      });
      return;
    }

    // 手机号格式校验（如果提供了手机号）
    if (registerForm.value.phone && registerForm.value.phone.trim()) {
      const phoneRegex = /^1[3-9]\d{9}$/;
      if (!phoneRegex.test(registerForm.value.phone.trim())) {
        $q.notify({
          type: 'warning',
          message: '请输入正确的手机号（11位数字，以1开头）',
        });
        return;
      }
    }

    if (registerForm.value.password.length < 6) {
      $q.notify({
        type: 'warning',
        message: '密码至少需要6位',
      });
      return;
    }

    if (registerForm.value.password !== registerForm.value.confirmPassword) {
      $q.notify({
        type: 'warning',
        message: '两次输入的密码不一致',
      });
      return;
    }

    loading.value = true;
    try {
      await register(
        registerForm.value.name,
        registerForm.value.email,
        registerForm.value.password,
        registerForm.value.phone?.trim() || undefined
      );
      $q.notify({
        type: 'positive',
        message: '注册成功，请登录',
      });
      activeTab.value = 'login';
      loginForm.value.username = registerForm.value.name;
      registerForm.value = {
        name: '',
        email: '',
        password: '',
        confirmPassword: '',
        phone: '',
      };
    } catch (error: any) {
      $q.notify({
        type: 'negative',
        message: error.message || '注册失败',
      });
      throw error;
    } finally {
      loading.value = false;
    }
  };

  return {
    // 状态
    activeTab,
    loading,
    loginForm,
    registerForm,
    // 方法
    handleLogin,
    handleRegister,
  };
}

